﻿ControlUtility = function () {

}

/**
* [関数名] Sics.ControlUtility.PopDivAlignCenter
* [機　能] 共通Popup画面（例：グループ選択、ディレクトリ選択、ファイル選択、ポートレット選択など） 
*          がIEドキュメント中央に設定する。 
* [引　数]
* @param popupDivContainer ポップアップコントロールContainer
* @param source            イベント/HtmlElement/表示位置モード(center)
* [返り値] なし 
*/
ControlUtility.PopDivAlignCenter = function (popupDivContainer, source) {
    popupDivContainer = $(popupDivContainer);
    //親画面可視領域の高さ
    var height = MainScript.getClientHeight();
    //親画面可視領域の長さ
    var width = MainScript.getClientWidth();

    var hasZoomedValue = 1;

    //コントロールの高さ
    var controlHeight = parseInt(popupDivContainer.style.height, 10);
    //コントロールの長さ
    var controlWidth = parseInt(popupDivContainer.style.width, 10);
    if (isNaN(controlHeight) || isNaN(controlWidth)) {
        var rect = Element.getDimensions(popupDivContainer);
        controlHeight = parseInt(rect.height, 10);
        controlWidth = parseInt(rect.width, 10);
    }

    //親画面の高さ＜コントロールの高さの場合
    if (height < controlHeight) height = controlHeight;
    //親画面の長さ＜コントロールの長さの場合
    if (width < controlWidth) width = controlWidth;

    var scrollTop = MainScript.getScrollTop();
    var scrollLeft = MainScript.getScrollLeft();

    //2008/08/01以前のバージョン：親画面の中央に表示します
    //popupDivContainer.style.top = ((height - controlHeight)/2 + scrollTop) + "px";
    //popupDivContainer.style.left = ((width - controlWidth)/2 + scrollLeft) + "px";  

    if (source != null) {
        //絶対位置取得用の変数
        var position = null;
        try {
            //表示位置モード指定場合
            if (source == "center") {
                //Windowの上下中心に表示する
                popupDivContainer.style.top = ((height - controlHeight) / 2 + scrollTop) * hasZoomedValue + "px";
            }
            else {
                //HtmlElement指定場合
                if (typeof (source.id) != "undefined") {
                    position = MainScript.getElementPosition(source);
                }
                    //イベント指定場合
                else {
                    position = MainScript.getElementPosition(Event.element(source));
                }

                if (position.y - scrollTop > (controlHeight + 20)) {
                    popupDivContainer.style.top = (position.y - (controlHeight + 20)) * hasZoomedValue + "px";
                }
                else {
                    popupDivContainer.style.top = (scrollTop + 20) * hasZoomedValue + "px";
                }
            }
        }
        catch (e) {
            popupDivContainer.style.top = (scrollTop + 20) * hasZoomedValue + "px";
        }
    }
    else {
        popupDivContainer.style.top = (scrollTop + 20) * hasZoomedValue + "px";
    }

    //Windowの左右中心に表示する
    popupDivContainer.style.left = ((width - controlWidth) / 2 + scrollLeft) * hasZoomedValue + "px";
}

/**
* [関数名] DragDrop
* [機　能] コントロールドラッグ＆ドロップ用JSクラス定義
* [引　数] なし 
* [返り値] なし 
*/
DragDrop = function () { }

/**
* [関数名] Sics.DragDrop.Start
* [機　能] ドラッグ＆ドロップ開始  
* [引　数]
* @param containerID コントロール用Div ID
* @param event イベント 
* [返り値] なし 
*/
DragDrop.Start = function (containerID, event) {
    if (!Event.isLeftClick(event)) {
        return;
    }

    var controlContainerObj = $(containerID);
    var left = !!controlContainerObj.style.left ? controlContainerObj.style.left : 0;
    var top = !!controlContainerObj.style.top ? controlContainerObj.style.top : 0;

    var x = parseInt(left, 10);
    var y = parseInt(top, 10);
    var deltaX = Event.pointerX(event) - x;
    var deltaY = Event.pointerY(event) - y;

    Event.observe(document, 'mousemove', MouseMoveHandler);
    Event.observe(document, 'mouseup', MouseUpHandler);
    Event.observe(document, "selectstart", SelectStartHandler);

    Event.stop(event);

    /**
    * [関数名] MouseMoveHandler
    * [機　能] マウス移動処理（ドラッグ＆ドロップ処理開始）    
    * [引　数]
    * @param event イベント 
    * [返り値] なし 
    */
    function MouseMoveHandler(event) {
        controlContainerObj.style.left = Event.pointerX(event) - deltaX + "px";
        controlContainerObj.style.top = Event.pointerY(event) - deltaY + "px";
        SelectStartHandler();
        Event.stop(event);
    }

    /**
    * [関数名] MouseUpHandler
    * [機　能] マウスアップ処理（ドラッグ＆ドロップ処理完了）  
    * [引　数]
    * @param event イベント 
    * [返り値] なし 
    */
    function MouseUpHandler(event) {
        Event.stopObserving(document, 'mousemove', MouseMoveHandler);
        Event.stopObserving(document, 'mouseup', MouseUpHandler);
        Event.stopObserving(document, "selectstart", SelectStartHandler);
        Event.stop(event);
    }

    //画面上でドラッグでテキスト選択が出来ないよう、onSelectStartでreturn falseを返すだけのFunction。IEのため。
    function SelectStartHandler(e) {
        return false;
    }

    function debug(msg) {
        //$("debug").innerHTML = msg;
    }
}

/*************************************************************************************************************/
/**
* [関数名] Sics.EstopLayer
* [機　能] Sics.EstopLayerクラスを定義する
* [引　数] なし
* [返り値] なし
*/
EstopLayer = function () {
}

EstopLayer.prototype.tagTypeList = ['A', 'INPUT', 'SELECT', 'TEXTAREA', 'IFRAME'];

//Create the estop layer's filterList parameter.
EstopLayer.prototype.filterList = [];

//Create the document object array parameter.
EstopLayer.prototype.userControlList = [];

//filter's arg
EstopLayer.prototype.opacity = 10;

//Sets or retrieves the stacking order of positioned objects.
EstopLayer.prototype.zIndex = 1999;

//Sets or retrieves the color behind the content of the object. 
EstopLayer.prototype.backgroundColor = "#000000";

//When the filter had append to body the appendCompleteFlag is true, if not the appendCompleteFlag is false.
EstopLayer.prototype.appendCompleteFlag = false;

//Store the dom that will be control the TabIndex value.
EstopLayer.prototype.DHTMLList = [];

/**
* [関数名] Sics.EstopLayer.prototype.show
* [機　能] 表示処理
* [引　数] 
* @param userControlFrameDom  ユーザコントロールDOM 
* [返り値] なし
*/
EstopLayer.prototype.show = function (userControlFrameDom, isNeedZoom) {

    //Set the dom Tab.
    this.setTabIndex(document.body, EstopLayer.tagTypeList, -1);
    this.setTabIndex(userControlFrameDom, EstopLayer.tagTypeList, 0);
    
    if (this.userControlList.length > 0 && this.userControlList[this.userControlList.length - 1].id == $(userControlFrameDom).id) return;
    if (MainScript.isNullOrEmpty(isNeedZoom)) isNeedZoom = true;
    //画面扩大125%;
    if (MainScript.isIE() && MainScript.getIEVersion() > 8
        && !MainScript.isNullOrEmpty(userControlFrameDom)
        && !MainScript.isNullOrEmpty(userControlFrameDom.style)
        && isNeedZoom) {
        userControlFrameDom.style.zoom = 1;
    }
    //Create the div element.
    var divFilter = document.createElement("div");

    //DIVユニークID
    var divID = userControlFrameDom.id + 'ctlEstopLayerDiv_1q2w3e4r5t6y7u8i9o0p1a2s3d4f5g6h7j8k9l0';

    //set the div's Properties.
    divFilter.id = divID;
    divFilter.style.left = 0 + 'px';
    divFilter.style.top = 0 + 'px';
    divFilter.style.display = 'block';
    divFilter.style.visibility = 'hidden';
    divFilter.style.position = 'absolute';
    divFilter.style.border = 'none';
    divFilter.style.backgroundColor = this.backgroundColor;
    divFilter.style.filter = 'alpha(opacity=' + this.opacity + ')'; //IE
    divFilter.style.opacity = this.opacity / 100; //FireFox
    divFilter.style.visibility = 'visible';

    //該当filterのDOM対象はDocumentに追加する
    this.appendChildToBody(divFilter);

    //親コントロール対象が存在場合
    //伏学发 2012/10/22 注视掉以下的处理
    //if (this.filterList.length > 0) {
    this.appendChild(userControlFrameDom, document.body);
    //}

    //Set the filter div's zIndex.
    divFilter.style.zIndex = this.zIndex;
    //Set the control's zIndex.
    userControlFrameDom.style.zIndex = this.zIndex + 100;

    this.zIndex = this.zIndex + 200;

    //Set window to observe the ReSize event.
    Event.observe(window, 'resize', this.reSize.bind(this));



    //Push the filter to filterList.
    this.filterList.push(divFilter);

    //Push the UserControl's Dom to the userControlList.
    this.userControlList.push($(userControlFrameDom));

    //Implement the ReSize method, so that to set width and height both the div and iframe.
    this.reSize();
};

EstopLayer.prototype.appendChildToBody = function (divFilter) {
    if (MainScript.isIE() && document.readyState != "complete") {
        window.setTimeout(function () { EstopLayer.appendChildToBody.bind(divFilter); }, 100);
        return;
    }
    document.body.appendChild(divFilter);
    this.appendCompleteFlag = true;
};

/**
* [関数名] Sics.EstopLayer.prototype.hide
* [機　能] 非表示処理
* [引　数] 
* @param userControlFrameDom  ユーザコントロールDOM 
* [返り値] なし
*/
EstopLayer.prototype.hide = function (userControlFrameDom) {
    if (userControlFrameDom == null || $(userControlFrameDom) == null) {
        CmnMessage.showMessage(_T("ControlUtility.EstopLayer.ParamsError"), SICS_MSG_TYPE_ERROR);
        return;
    }

    //Rollback the dom TabIndex's value.
    this.rollbackTabIndex();

    if (this.userControlList.length == 0 || this.userControlList[this.userControlList.length - 1].id != $(userControlFrameDom).id) {
        return;
    }

    //filter対象を表示しない
    this.filterList[this.filterList.length - 1].style.visibility = 'hidden';

    //filter対象を削除する
    this.elementRemoveFromBody(this.filterList[this.filterList.length - 1]);

    //親コントロールが存在場合、該当コントロールのDOM対象を親コントロールに追加する。
    if (this.filterList.length > 1) {
        //Append the control to parent's control
        //伏学发 2012/10/22 注视掉以下的处理
        //this.appendChild(this.userControlList[this.userControlList.length - 1], this.userControlList[this.userControlList.length - 2]);

        //親コントロールのTabIndexを再度設定する
        this.setTabIndex(document.body, EstopLayer.tagTypeList, -1);
        this.setTabIndex(this.userControlList[this.userControlList.length - 2], EstopLayer.tagTypeList, 0);
    }

    //Delete the the point estop's relation.
    this.filterList.pop();

    //Delete the the point UserControl's relation.
    this.userControlList.pop();

    //Implement the ReSize method, so that to set width and height both the div and iframe.
    this.reSize();
};

EstopLayer.prototype.elementRemoveFromBody = function (divFilter) {
    if (!this.appendCompleteFlag) {
        window.setTimeout(function () { EstopLayer.elementRemoveFromBody.bind(divFilter); }, 100);
        return;
    }
    Element.remove(divFilter);
};

/**
* [関数名] Sics.EstopLayer.prototype.reSize
* [機　能] リサイズ処理
* [引　数] 
* @param event  イベント
* [返り値] なし
*/
EstopLayer.prototype.reSize = function (event) {
    var scrollHeight = MainScript.getScrollHeight();
    var clientHeight = MainScript.getClientHeight();
    var scrollWidth = MainScript.getScrollWidth();
    var clientWidth = MainScript.getClientWidth();

    //Set the estop layer's height.
    for (var i = 0; i < this.filterList.length; i++) {
        if (scrollHeight > clientHeight) {
            this.filterList[i].style.height = scrollHeight + 'px';
        }
        else {
            this.filterList[i].style.height = clientHeight + 'px';
        }

        //Set the estop layer's width.
        if (scrollWidth > clientWidth) {
            this.filterList[i].style.width = scrollWidth + 'px';
        }
        else {
            this.filterList[i].style.width = clientWidth + 'px';
        }
    }
};

/**
* [関数名] Sics.EstopLayer.prototype.getElements
* [機　能] 指定Dom要素に指定Tag名称の一覧対象を取得する
* [引　数] 
* @param domElement    指定Dom要素
* @param tagName       指定Tag名称
* [返り値] 
* @return 指定Tag名称の一覧対象
*/
EstopLayer.prototype.getElements = function (domElement, tagName) {
    return $(domElement).getElementsByTagName(tagName);
};

/**
* [関数名] Sics.EstopLayer.prototype.backupRadioAndCheckBoxStatus
* [機　能] 指定Dom対象にRadioとCheckBox対象の選択状態(checked)をバックアップする
* [引　数]
* @param divDom   指定Dom対象
* [返り値] なし
*/
EstopLayer.prototype.backupRadioAndCheckBoxStatus = function (divDom) {
    //指定Dom対象にRadioとCheckBox対象を取得する
    var List = this.getRadioAndCheckbox(divDom);

    //選択状態(checked)をバックアップする
    for (var i = 0; i < List.length; i++) {
        List[i].checkedFlag = List[i].checked;
    }
};

/**
* [関数名] Sics.EstopLayer.prototype.recoveryRadioAndCheckBoxStatus
* [機　能] 指定Dom対象にRadioとCheckBox対象の選択状態(checked)を回復する
* [引　数]
* @param divDom   指定Dom対象
* [返り値] なし
*/
EstopLayer.prototype.recoveryRadioAndCheckBoxStatus = function (divDom) {
    //指定Dom対象にRadioとCheckBox対象を取得する
    var List = this.getRadioAndCheckbox(divDom);

    //選択状態(checked)を回復する
    for (var i = 0; i < List.length; i++) {
        if (List[i].checkedFlag != undefined) {
            List[i].checked = List[i].checkedFlag;
        }
    }
};

/**
* [関数名] Sics.EstopLayer.prototype.getRadioAndCheckbox
* [機　能] 指定Dom対象にRadioとCheckBox対象を取得する
* [引　数]
* @param divDom   指定Dom対象
* [返り値] 
* @return 対象一覧 
*/
EstopLayer.prototype.getRadioAndCheckbox = function (divDom) {
    var List = [];

    //Get the input List array.
    var inputList = this.getElements(divDom, "input");

    //Get the radios and checkboxs from inputList.
    for (var i = 1; i < inputList.length; i++) {
        if (inputList[i].type == 'radio' || inputList[i].type == 'checkbox') {
            List.push(inputList[i]);
        }
    }
    return List;
};

/**
* [関数名] Sics.EstopLayer.prototype.appendChild
* [機　能] 指定親対象に子対象を追加する
* [引　数]
* @param child   子対象
* @param parent  親対象
* [返り値] なし
*/
EstopLayer.prototype.appendChild = function (child, parent) {
    this.backupRadioAndCheckBoxStatus(child);
    $(parent).appendChild(child);
    this.recoveryRadioAndCheckBoxStatus(child);
};

/**
* [関数名] Sics.EstopLayer.prototype.setTabIndex
* [機　能] 指定Element内部の指定HtmlTagのTabIndexを設定する
* [引　数]
* @param element   目標対象element
* @param typeList  HtmlTagリスト
* @param tabIndex  タブインデックス
* [返り値] なし
*/
EstopLayer.prototype.setTabIndex = function (element, typeList, tabIndex) {
    //指定HtmlTagの全部対象を取得する
    var ctlList = [];
    for (var i = 0; i < typeList.length; i++) {
        var list = $(element).getElementsByTagName(typeList[i]);
        ctlList.push(list);
    }

    for (var i = 0; i < ctlList.length; i++) {
        for (var j = 0; j < ctlList[i].length; j++) {
            var item = ctlList[i][j];
            //tabIndexバックアップ処理
            if (item.storeTabIndex == 'undefined') {
                item.storeTabIndex = item.tabIndex;
            }
            item.tabIndex = tabIndex;

            //親画面の場合　And　IEの場合　And　(Submitボタン 或は Radioボタン)の場合 And disabledプロパティが存在する場合
            //指定項目にtoggleDisabledプロパティを作成する
            if (tabIndex == -1 &&
                MainScript.isIE() &&
                item.tagName == 'INPUT' &&
                (item.type == 'submit' || item.type == 'radio') &&
                !item.disabled) {
                item.disabled = true;
                item.toggleDisabled = true;
            }

            //指定コントロール内部のSubmit/Radioボタンの有効化処理
            if (tabIndex == 0) {
                if (MainScript.isIE() &&
                    item.tagName == 'INPUT' &&
                    (item.type == 'submit' || item.type == 'radio') &&
                    item.toggleDisabled != 'undefined' &&
                    item.toggleDisabled) {
                    item.disabled = false;
                    item.toggleDisabled = false;
                }
            }

            this.DHTMLList.push(item);
        }
    }
};

/**
* [関数名] Sics.EstopLayer.prototype.rollbackTabIndex
* [機　能] タブインデックスのロールバック処理
* [引　数] なし
* [返り値] なし
*/
EstopLayer.prototype.rollbackTabIndex = function () {
    for (var i = 0; i < this.DHTMLList.length; i++) {
        var item = this.DHTMLList[i];
        if (item.storeTabIndex != 'undefined') {
            item.tabIndex = item.storeTabIndex;
        }

        //Rollback submit/radio button.
        if (MainScript.isIE() &&
            item.tagName == 'INPUT' &&
            (item.type == 'submit' || item.type == 'radio') &&
            item.toggleDisabled != 'undefined' &&
            item.toggleDisabled) {
            item.disabled = false;
            item.toggleDisabled = false;
        }
    }
    this.DHTMLList.clear();
};

//Sics.EstopLayerインスタンスを作成する
EstopLayer = new EstopLayer();
